import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from 'axios';
import { API_BASE_URL, API_TIMEOUT } from './config';
import { ApiResponse } from './types';
import { storage } from '../storage';

interface ErrorResponse {
  message?: string;
  code?: number;
  data?: any;
}

// 创建 axios 实例
const apiClient: AxiosInstance = axios.create({
  baseURL: API_BASE_URL,
  timeout: API_TIMEOUT,
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
apiClient.interceptors.request.use(
  async (config) => {
    // 从 storage 获取 token
    const token = await storage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
apiClient.interceptors.response.use(
  (response) => {
    // 检查响应中是否包含错误信息
    if (response.data?.code === 400) {
      const error = {
        code: 400,
        message: response.data.message || '请求失败',
        data: response.data.data,
      };
      return Promise.reject(error);
    }
    return response;
  },
  async (error: AxiosError<ErrorResponse>) => {
    if (error.response) {
      // 处理 401 未授权错误
      if (error.response.status === 401) {
        await storage.multiRemove(['token', 'user']);
      }
      
      // 返回统一的错误格式
      return Promise.reject({
        code: error.response.status,
        message: error.response.data?.message || '请求失败',
        data: error.response.data,
      });
    }
    
    // 处理网络错误
    if (error.request) {
      return Promise.reject({
        code: -1,
        message: '网络连接失败，请检查网络设置',
      });
    }
    
    // 处理其他错误
    return Promise.reject({
      code: -1,
      message: error.message || '未知错误',
    });
  }
);

// 通用请求方法
export async function request<T = any>(
  config: AxiosRequestConfig
): Promise<ApiResponse<T>> {
  try {
    const response = await apiClient(config);
    return {
      code: 200,
      message: 'success',
      data: response.data,
    };
  } catch (error: any) {
    console.error('API Request Error:', error);
    // 直接返回错误对象，而不是抛出异常
    return {
      code: error.code || 500,
      message: error.message || '请求失败',
      data: error.data || null,
    };
  }
}

// 导出实例和请求方法
export { apiClient };
export default request; 